package com.example.leetcode.day;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 写出一个秘密数字，并请朋友猜这个数字是多少。朋友每猜测一次，你就会给他一个包含下述信息的提示：
 *
 * 猜测数字中有多少位属于数字和确切位置都猜对了（称为 "Bulls"，公牛），
 * 有多少位属于数字猜对了但是位置不对（称为 "Cows"，奶牛）。也就是说，这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字。
 * 给你一个秘密数字 secret 和朋友猜测的数字 guess ，请你返回对朋友这次猜测的提示。
 *
 * 提示的格式为 "xAyB" ，x 是公牛个数， y 是奶牛个数，A 表示公牛，B 表示奶牛。
 *
 * 请注意秘密数字和朋友猜测的数字都可能含有重复数字。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/bulls-and-cows
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Day299 {

    public String getHint(String secret, String guess) {
        Map<Character, Integer> map = new HashMap<>();
        Map<Character,Integer>  map1 = new HashMap<>();
        int right = 0;
        int error = 0;
        for (int i = 0;i<secret.length();i++) {
            char c = secret.charAt(i);
            char c1 = guess.charAt(i);
            if (c == c1) {
                right++;
            }else {
                map.put(c,map.getOrDefault(c,0) + 1);
                map1.put(c1,map1.getOrDefault(c1,0) + 1);
            }
        }
        for (Map.Entry<Character,Integer> entry:map1.entrySet()) {
            Character key = entry.getKey() ;
            if (map.containsKey(key)) {
                error += Math.min(map.get(key),map1.get(key));
            }
        }
        return right + "A" + error + "B";
    }

    public static void main(String[] args) {
        String secret = "1123";
        String guess = "0111";
        Day299 d = new Day299();
        System.out.println(d.getHint(secret, guess));
    }
}
